package com.atguigu.assionexcel.thread;

import java.util.concurrent.*;

/**
 * @author  描述：ThreadPoolExecutor创建线程池
 * @create 2021-11-30 9:45
 */
public class MyThreadPool {
    public static void main(String[] args) {
        ExecutorService threadPool = new ThreadPoolExecutor(
                //1、核心线程数；2、最大线程数；3存活时间；4、时间单位。
                2,
                5,
                2L,
                TimeUnit.SECONDS,
                //5、阻塞队列：可选ArrayBlockingQueue、LinkedBlockingQueue、SynchronousQueue。
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                /*7、线程池的抛弃策略
                    AbortPolicy();//默认，队列满了丢任务，抛出异常
                    DiscardPolicy();//队列满了丢任务，不抛出异常
                    DiscardOldestPolicy();//将最早进入队列的任务删除之后再尝试加入队列
                    CallerRunsPolicy();//如果添加到线程池失败，那么主线程会自己去执行该任务，回退
                 */
                new ThreadPoolExecutor.CallerRunsPolicy());

            try {
                //模拟有20个人前来买瓜
                // 最大容量为：maximumPoolSize + workQueue = 最大容量数
                    for (int i = 0; i < 20; i++) {
                    threadPool.execute(() ->{
                    System.out.println(Thread.currentThread().getName() + "卖出瓜");
                });
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                threadPool.shutdown();
            }
        }
    }

